package solicitudesApp.Core;

import java.sql.SQLException;

import javax.swing.JPanel;

import sMySQLappTemplate.Core.AppCoreTemplate;
import sMySQLappTemplate.Core.Command;
import sMySQLappTemplate.Core.ExtensionPoint;
import sMySQLappTemplate.Core.FeatureTemplate;

import sMySQLappTemplate.Exceptions.DuplicatedActionName;
import sMySQLappTemplate.Exceptions.InvalidButtonLocation;
import sMySQLappTemplate.Exceptions.UntestedConnectionException;

import solicitudesApp.Functions.ControlFiltros;
import solicitudesApp.Functions.EfectuarPase;
import solicitudesApp.Functions.EliminarSolicitud;
import solicitudesApp.Functions.ModificarSolicitud;
import solicitudesApp.Functions.NuevaSolicitud;

import solicitudesApp.GUI.MainWindowSolicitudes;

public class ApplicationsAppCore extends AppCoreTemplate
{
	private TablaSolicitudes tablaSolicitudes;
	private int tablaSolicitudesRowSelected;
	private ExtensionPoint extPoint_TablaSolUpdateQuery;
	
	private TablaPedidos tablaPedidos;	
	private TablaRequisitos tablaRequisitos;
	
	private MainWindowSolicitudes masterWindow;	
	
	// CONSTRUCTOR
	
	public ApplicationsAppCore() 
	{
		super();	
		// Inicializa la tabla principal de Solicitudes		
		this.cargarTablaSolicitudes();
	}
	
	// IMPLEMENTACION DE METODOS ABSTRACTOS
	
	@Override
	protected void initData() 
	{	
		tablaSolicitudes = new TablaSolicitudes();
		tablaPedidos = new TablaPedidos();
		tablaRequisitos = new TablaRequisitos();
		
		// Crea el punto de extension para la consulta de la tabla de solicitudes
		extPoint_TablaSolUpdateQuery = new ExtensionPoint();
		// Agrega la consulta base para la tabla de solicitudes
		// de esta misma forma deberian Hookearse los Filtros
		try {
			extPoint_TablaSolUpdateQuery.addAction(new queryBaseTablaSolicitudes(null), "Base_Query");
		} catch (DuplicatedActionName e) {
			// TODO No deveria pasar
			e.printStackTrace();
		}
	}
	
	@Override
	protected void initGUI() 
	{	
		masterWindow = new MainWindowSolicitudes(this);
		masterWindow.setVisible(true);
	}

	@Override
	protected void initFeatures() 
	{
		features = new FeatureTemplate[5];
		features[0] = new NuevaSolicitud(this);
		features[1] = new ModificarSolicitud(this);
		features[2] = new EliminarSolicitud(this);
		features[3] = new ControlFiltros(this);
		features[4] = new EfectuarPase(this);
	}
		
	// FUNCIONES ESPECIFICAS DE LA APLICACION
	
	/**
	 * <b>solicitudSeleccionada</b><br>
	 * @return int: el identificador numerico de la solicitud seleccionada
	 */

	public int getIdSolicitudSeleccionada()
	{	
		int row = masterWindow.getTablaSolicitudSelectedRow();
		return Integer.parseInt(tablaSolicitudes.getValueAt(row, 5).toString());
	}	
	
	// METODOS PARA REGISTRA BOTONES
	
	@SuppressWarnings("unchecked")
	public void registerButtonForApplicationsTools(Command featureComm, String iconPath, String buttonLabel)
	{
		JPanel appTools = masterWindow.applicationsTools;
		try {
			this.registerNewButtonFor(featureComm, appTools, iconPath, buttonLabel);
		} catch (InvalidButtonLocation e) {
			// TODO cartelito de erro interno
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public void registerButtonForRequestsTools(Command featureComm, String iconPath, String buttonLabel)
	{
		JPanel reqTools = masterWindow.requestsTools;
		try {
			this.registerNewButtonFor(featureComm, reqTools, iconPath, buttonLabel);
		} catch (InvalidButtonLocation e) {
			// TODO cartelito de erro interno
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public void registerButtonForRequirementsTools(Command featureComm, String iconPath, String buttonLabel)
	{
		JPanel reqTools = masterWindow.requirementsTools;
		try {
			this.registerNewButtonFor(featureComm, reqTools, iconPath, buttonLabel);
		} catch (InvalidButtonLocation e) {
			// TODO cartelito de erro interno
			e.printStackTrace();
		}
	}
	
	// UTILIDADES
	
	public void tablaSolicitudesSelectionChanged(int row) 
	{
		this.tablaSolicitudesRowSelected = row;
		this.cargarTablaPedidos();
		this.cargarTablaRequisitos();		
	}
	
	/**
	 * <b>reloadTablaSolicitudes</b><br>
	 * Carga y muestra la tabla de solicitudes.<br>
	 */

	public void cargarTablaSolicitudes()
	{
		try {		   
			String query = (String)extPoint_TablaSolUpdateQuery.execExtensionPoint();
			populateTable(tablaSolicitudes, query);
		} catch (SQLException e) {
			// TODO Cartel de Error Grave
			e.printStackTrace();
		}
	}
	
	private class queryBaseTablaSolicitudes extends Command<Object>
	{
		public queryBaseTablaSolicitudes(FeatureTemplate feature) {
			super(feature);
			// TODO Auto-generated constructor stub
		}
		@Override
		public Object ExecCommand(Object... args) {
			return new String (
				"SELECT Interesado_Persona_DNI, Tipo_Solicitud_Denominacion, Destino_Denominacion, Estado, fechaRegistro, idSolicitud " +
					"FROM Solicitudes JOIN Pases " +
					"WHERE " +
					   "Solicitudes.idSolicitud = Pases.Solicitud_idSolicitud AND " +
					   "Pases.idPase = (" +
					 	  "SELECT MAX(Pases.idPase) FROM Pases " +
					 	  "WHERE Solicitud_idSolicitud = idSolicitud GROUP BY Pases.Solicitud_idSolicitud" +
					   ") AND " +
					   "Solicitudes.fecha_baja is null;");
		}		
	}
	
	/**
	 * <b>reloadTablaPedidos</b><br>
	 * Carga y muestra la tabla de pedidos segun la solicitud
	 * seleccionada.<br>
	 */
	
	public void cargarTablaPedidos() 
	{
		int idSoli = Integer.parseInt((tablaSolicitudes.getValueAt(tablaSolicitudesRowSelected, 5).toString()));
		String query = "SELECT Descripcion, fecha_alta " +
							"FROM pedidos " +
							"WHERE Solicitud_idSolicitud = "+idSoli+" AND " +
							"fecha_baja is null;";
		try {
			this.populateTable(tablaPedidos, query);
		} catch (SQLException e) {
			// TODO Cartelito de Error grave (interno)
			e.printStackTrace();
		}
	}
	
	/**
	 * <b>reloadTablaRequisitos</b><br>
	 * Carga y muestra la tabla de requisitos segun el tipo de solicitud 
	 * seleccionada.<br>
	 */
	
	public void cargarTablaRequisitos() 
	{
		String tSoli = (tablaSolicitudes.getValueAt(tablaSolicitudesRowSelected, 1)).toString();
		String query = "SELECT Tipo_Requisito_Denominacion " +
							"FROM Requiere " +
							"WHERE Tipo_Solicitud_Denominacion = '"+tSoli+"';";
		try {
			this.populateTable(tablaRequisitos, query);
		} catch (SQLException e) {
			// TODO Cartelito de Error grave (interno)
			e.printStackTrace();
		}
	}
	

	public TablaSolicitudes getTablaSolicitudes() {
		return tablaSolicitudes;
	}

	public TablaPedidos getTablaPedidos() {
		return tablaPedidos;
	}

	public TablaRequisitos getTablaRequisitos() {
		return tablaRequisitos;
	}

	public ExtensionPoint getExtPoint_TablaSolUpdateQuery() {
		return extPoint_TablaSolUpdateQuery;
	}
}
